//
// Created by XML on 2023/9/21.
//

#include <stdio.h>
#include <stdarg.h>

// 宏函数的方式：实现日志自动换行
// __VA_ARGS__ 是一个宏，用于接收宏的变长参数 , 前面## 是用于无变长参数的情况
// "Hello ""world" ==> "Hello world"
#define PRINTLN2(format, ...) printf(format"\n", ##__VA_ARGS__)

// 宏
// __FILE__  : 当前文件路径
// __LINE__  : 当前调用的行数
// __FUNCTION__ ： 当前所在的函数名称
// (../17.printlnf.c:20) main :
//#define PRINTLN(format, ...) printf("("__FILE__":%d) %s : "format"\n",__LINE__, __FUNCTION__, ##__VA_ARGS__)
#define PRINTLN(format, ...) printf("(%s:%d) %s : "format"\n",__FILE__,__LINE__, __FUNCTION__, ##__VA_ARGS__)

// #value 会输入宏参数的字命量的名称，比如传入参数名称是x ，x：x的值
#define PRINT_INT(value) PRINTLN(#value": %d",value)

// 函数方式实现，日志自动换行
void println(const char *format, ...){
    va_list args;
    va_start(args, format);
    vprintf(format, args);
    printf("\n");
    va_end(args);
}

int main(){

    PRINTLN2("通过函数实现日志自动换行");

    println("hello world %d",2);
    println("hello world %d",3);

    PRINTLN2("通过宏实现日志自动换行");

    PRINTLN("hello world %d",4);
    PRINTLN("hello world %f",5.);
    PRINTLN("hello world ");//无变长参数

    PRINT_INT(1+2);
    int x = 6;
    PRINT_INT(x);

    return 0;
}